home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSC
/
parse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-10-14
|
42KB
|
1,513 lines
/**********************************
* KMS *
**********************************
* ©1992 by BlackMagic Software *
**********************************
* *
**********************************/
#include <KMS/KMS.h>
#include <KMS/KMS_devlib.h>
#include <workbench/workbench.h>
#include <workbench/icon.h>
#include <workbench/startup.h>
#include <clib/icon_protos.h>
Prototype BOOL ParseArgs(VOID);
Prototype BOOL ParseToolTypes(struct WBStartup *);
Prototype UBYTE ParsePrint(STRPTR, UWORD);
Prototype UWORD CmdParse(STRPTR, UWORD);
Prototype BOOL CmdInterpreter(VOID);
Prototype BOOL CmdExecute(UWORD);
Prototype UWORD CmdSearch(STRPTR);
Prototype BOOL CmpArg(UBYTE, STRPTR);
Prototype STRPTR MsgStringParse(STRPTR, STRPTR, UWORD);
Prototype STRPTR StdStringParse(STRPTR, STRPTR, UWORD);
Prototype BOOL ParseRange(STRPTR);
Prototype BOOL ChatInterpreter(STRPTR);
Prototype BOOL ChatCmd(STRPTR);
/*****************************
* Externe Globale Variablen *
*****************************/
extern struct KMSBase *KMSBase;
extern struct LocalConfig *KMS_LC;
extern BOOL Immediate;
extern BOOL PreLogin;
extern BOOL AutoShutDown;
extern BOOL OwnScreen;
extern TEXT PreUser[];
extern BOOL UsePCFont;
extern TEXT PathString[];
extern UMSAccount SysUMSAccount, MyUMSAccount;
extern UBYTE ShutDown, Plop;
extern BOOL Spying;
/*********************
* Globale Variablen *
*********************/
STRPTR CmdArgV[MAXCMDARGS];
UBYTE CmdArgC;
STRPTR PPArg = NULL, PPArg2 = NULL, PPArg3 = NULL, PPArg4 = NULL;
/*********************************************
* Beim Start übergebene Parameter auswerten *
*********************************************
* I: --- *
* O: Fehler: TRUE *
*********************************************/
/// "ParseArgs"
extern struct RDArgs *ReadArgs(STRPTR, LONG *, struct RDArgs *);
extern VOID FreeArgs(struct RDArgs *);
#define TEMPLATE "WINDOW/K,OWNSCREEN/S,REMOTE/S,IMMEDIATE/S,AUTOSHUT/S,USERNAME/K,PASSWORD/K,BPS/K/N,SPYWIN/K,DEVICE/K,UNIT/K/N,PCFONT/S"
BOOL ParseArgs(VOID)
{
UBYTE n;
struct UserNode *upoint;
static struct RDArgs *rargs = NULL;
ULONG args[12];
for(n = 0; n < 12; n++)
args[n] = 0;
KMS_LC->Device = DEV_CONSOLE;
KMS_LC->Session.LineSpeed = 0;
Immediate = FALSE;
PreLogin = FALSE;
AutoShutDown = FALSE;
OwnScreen = FALSE;
*PreUser = '\0';
*KMS_LC->WinDim = '\0';
*KMS_LC->SpyWin = '\0';
UsePCFont = FALSE;
strcpy(KMS_LC->SerDevice, "serial.device");
KMS_LC->SerUnit = 0;
if (!(rargs=(struct RDArgs *)ReadArgs(TEMPLATE, args, NULL)))
{
printf("Bad args.\n");
return TRUE;
}
if (args[0]) /* WINDOW/K */
{
if (strlen((STRPTR)args[0])+1 <= sizeof(KMS_LC->WinDim))
strcpy(KMS_LC->WinDim, (STRPTR)args[0]);
else
{
printf("String too long.\n");
FreeArgs(rargs);
return TRUE;
}
}
if (args[1]) /* OWNSCREEN/S */
OwnScreen = TRUE;
if (args[2]) /* REMOTE/S */
KMS_LC->Device = DEV_SERIAL;
if (args[3]) /* IMMEDIATE/S */
Immediate = TRUE;
if (args[4]) /* AUTOSHUT/S */
AutoShutDown = TRUE;
if (args[5]) /* USERNAME/K */
{
if (!(upoint = UserCheck((STRPTR)args[5])))
{
printf("User not found.\n");
FreeArgs(rargs);
return TRUE;
}
else
{
strcpy(PreUser, upoint->UserData.Name);
Immediate = TRUE;
}
}
if (args[6]) /* PASSWORD/K */
{
if (*PreUser)
{
STRPTR pw = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, upoint->UserData.RealName,
UMSTAG_CfgName, "PASSWORD",
TAG_DONE);
if (!pw || UMSErrNum(SysUMSAccount))
{
printf("Error checking password.\n");
if (pw)
FreeUMSConfig(SysUMSAccount, pw);
FreeArgs(rargs);
return TRUE;
}
if (pw)
FreeUMSConfig(SysUMSAccount, pw);
TEXT varbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
if (!(MyUMSAccount = UMSRLogin(varbuff, upoint->UserData.RealName, (STRPTR)args[6])))
{
printf("Bad password.\n");
FreeArgs(rargs);
return TRUE;
}
else
{
KMS_LC->Session.CurrentUser = upoint;
strcpy(KMS_LC->Session.Password, (STRPTR)args[6]);
PreLogin = TRUE;
}
}
else
{
printf("No password without username.\n");
FreeArgs(rargs);
return TRUE;
}
}
if (args[7]) /* BPS/K/N */
KMS_LC->Session.LineSpeed = *((ULONG *)args[7]);
if (args[8]) /* SPYWIN/K */
{
if (strlen((STRPTR)args[8])+1 <= sizeof(KMS_LC->SpyWin))
strcpy(KMS_LC->SpyWin, (STRPTR)args[8]);
else
{
printf("String too long.\n");
FreeArgs(rargs);
return TRUE;
}
KMS_LC->SpyHandle = Open(KMS_LC->SpyWin, MODE_OLDFILE);
if (!KMS_LC->SpyHandle)
{
printf("Spy window failed to open.\n");
FreeArgs(rargs);
return TRUE;
}
else
Spying = TRUE;
}
if (args[9])
{
strncpy(KMS_LC->SerDevice, (STRPTR)args[9], LEN_DOSFILE);
KMS_LC->SerDevice[LEN_DOSFILE] = '\0';
}
if (args[10])
KMS_LC->SerUnit = (UBYTE)*((ULONG *)args[10]);
if (args[11]) /* PCFONT/S */
UsePCFont = TRUE;
FreeArgs(rargs);
return FALSE;
}
///
/*********************************************
* Beim WB-Start ToolTypes auswerten *
*********************************************
* I: struct WBStartup * *
* O: Fehler: TRUE *
*********************************************/
/// "ParseToolTypes"
extern BPTR CurrentDir(BPTR);
BOOL ParseToolTypes(struct WBStartup *wbstartup)
{
struct DiskObject *dobj = NULL;
struct Library *icbase = NULL;
struct WBArg *wbarg = NULL;
STRPTR *tt, tooltype;
BPTR olddir = -1;
struct UserNode *upoint;
KMS_LC->Device = DEV_CONSOLE;
KMS_LC->Session.LineSpeed = 0;
Immediate = FALSE;
PreLogin = FALSE;
AutoShutDown = FALSE;
OwnScreen = FALSE;
*PreUser = '\0';
*KMS_LC->WinDim = '\0';
*KMS_LC->SpyWin = '\0';
strcpy(KMS_LC->SerDevice, "serial.device");
KMS_LC->SerUnit = 0;
if (!wbstartup)
return TRUE;
wbarg = wbstartup->sm_ArgList; /* Tool */
if (wbstartup->sm_NumArgs > 1)
wbarg++; /* First Project */
if (wbarg->wa_Lock && wbarg->wa_Name)
olddir = CurrentDir(wbarg->wa_Lock);
else
return TRUE;
if (icbase = OpenLibrary(ICONNAME, 36))
dobj = GetDiskObject(wbarg->wa_Name);
if (olddir != -1)
CurrentDir(olddir);
if (!dobj)
{
CloseLibrary(icbase);
return TRUE;
}
tt = dobj->do_ToolTypes;
if (tooltype = FindToolType(tt, "WINDOW"))
{
if (strlen(tooltype)+1 < sizeof(KMS_LC->WinDim))
strcpy(KMS_LC->WinDim, tooltype);
else
{
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
}
else
strcpy(KMS_LC->WinDim, "CON:0/0//999/KMS Default Window");
if (tooltype = FindToolType(tt, "OWNSCREEN"))
OwnScreen = TRUE;
if (tooltype = FindToolType(tt, "REMOTE"))
KMS_LC->Device = DEV_SERIAL;
if (tooltype = FindToolType(tt, "IMMEDIATE"))
Immediate = TRUE;
if (tooltype = FindToolType(tt, "AUTOSHUT"))
AutoShutDown = TRUE;
if (tooltype = FindToolType(tt, "USERNAME"))
{
if (!(upoint = UserCheck(tooltype)))
{
Error("FATAL ERROR: [ParseToolTypes] User not found.");
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
else
{
strcpy(PreUser, upoint->UserData.Name);
Immediate = TRUE;
}
}
if (tooltype = FindToolType(tt, "PASSWORD"))
{
if (*PreUser)
{
STRPTR pw = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, upoint->UserData.RealName,
UMSTAG_CfgName, "PASSWORD",
TAG_DONE);
if (!pw || UMSErrNum(SysUMSAccount))
{
Error("FATAL ERROR: [ParseToolTypes] Error reading password.");
if (pw)
FreeUMSConfig(SysUMSAccount, pw);
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
TEXT varbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
if (!(MyUMSAccount = UMSRLogin(varbuff, upoint->UserData.RealName, tooltype)))
{
Error("FATAL ERROR: [ParseToolTypes] Bad password.");
if (pw)
FreeUMSConfig(SysUMSAccount, pw);
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
else
{
KMS_LC->Session.CurrentUser = upoint;
strcpy(KMS_LC->Session.Password, tooltype);
PreLogin = TRUE;
if (pw)
FreeUMSConfig(SysUMSAccount, pw);
}
}
else
{
Error("FATAL ERROR: [ParseToolTypes] No password without an username!");
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
}
if (tooltype = FindToolType(tt, "BPS"))
KMS_LC->Session.LineSpeed = atol(tooltype);
if (tooltype = FindToolType(tt, "SPYWIN"))
{
if (strlen(tooltype)+1 < sizeof(KMS_LC->SpyWin))
strcpy(KMS_LC->SpyWin, tooltype);
else
{
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
KMS_LC->SpyHandle = Open(KMS_LC->SpyWin, MODE_OLDFILE);
if (!KMS_LC->SpyHandle)
{
Error("FATAL ERROR: [ParseToolTypes] Spy window failed to open.");
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
else
Spying = TRUE;
}
if (tooltype = FindToolType(tt, "DEVICE"))
{
if (strlen(tooltype)+1 < sizeof(KMS_LC->SerDevice))
strcpy(KMS_LC->SerDevice, tooltype);
else
{
FreeDiskObject(dobj);
CloseLibrary(icbase);
return TRUE;
}
}
if (tooltype = FindToolType(tt, "UNIT"))
KMS_LC->SerUnit = (UBYTE)atoi(tooltype);
FreeDiskObject(dobj);
CloseLibrary(icbase);
return FALSE;
}
///
/***************************************
* Text-Interpreter Ausgabe *
***************************************
* I: Eingabestring, Flags *
* O: Break-Code *
***************************************/
/// "ParsePrint"
UBYTE ParsePrint(STRPTR input, UWORD flags)
{
TEXT output[LEN_PARSEOUT+1];
StdStringParse(input, output, LEN_PARSEOUT);
return Print(output, flags);
}
///
/***************************************
* Kommando-Parser *
***************************************
* I: STRPTR inbuff, UWORD inzeig *
* O: Neuer Wert von inzeig: *
* O: Position in Kommandozeile *
* O: (0: Zeilenende wurde erreicht) *
***************************************/
/// "CmdParse"
UWORD CmdParse(STRPTR inbuff, UWORD inzeig)
{
UWORD anfang = 0;
TEXT c;
CmdArgC = 0;
if (CmdArgV[0])
{
free(CmdArgV[0]);
CmdArgV[0] = NULL;
}
while(inbuff[inzeig] == ' ')
inzeig++;
do
{
if (inbuff[inzeig] == '"')
{
inzeig++;
anfang = inzeig;
while((c = inbuff[inzeig]) != '"' && c != '\0')
inzeig++;
}
else if (inbuff[inzeig] == '\'')
{
inzeig++;
anfang = inzeig;
while((c = inbuff[inzeig]) != '\'' && c != '\0')
inzeig++;
}
else if (CmdArgC == 0 && inbuff[inzeig] == '@')
{
anfang = inzeig;
inzeig++;
}
else
{
anfang = inzeig;
while((c = inbuff[inzeig]) != ' ' && c != ';' && c != '\0')
inzeig++;
}
CmdArgV[CmdArgC] = (STRPTR)malloc(inzeig-anfang+1);
if (!CmdArgV[CmdArgC])
{
SystemError("CmdParse", "Out of Memory");
CmdArgC = 0;
c = '\0';
}
else
{
strncpy(CmdArgV[CmdArgC], &inbuff[anfang], inzeig-anfang);
CmdArgV[CmdArgC][inzeig-anfang] = '\0';
CmdArgC++;
if ((CmdArgC < MAXCMDARGS) && CmdArgV[CmdArgC])
{
free(CmdArgV[CmdArgC]);
CmdArgV[CmdArgC] = NULL;
}
if (c == '"' || c == '\'')
inzeig++;
while((c = inbuff[inzeig]) == ' ')
inzeig++;
}
} while(c != '\0' && c != ';' && CmdArgC < MAXCMDARGS);
if (c != '\0' && c != ';')
{
/*
SysMsg(TOO_MANY_PARAMS);
*/
while((c = inbuff[inzeig]) != ';' && c != '\0')
inzeig++;
}
else if (c == ';')
inzeig++;
if (c == '\0')
inzeig = 0;
return inzeig;
}
///
/***************************************
* Kommando-Interpreter *
***************************************
* I: --- *
* O: keepgoing *
***************************************/
/// "CmdInterpreter"
BOOL CmdInterpreter(VOID)
{
BOOL keepgoing = TRUE;
UWORD inzeig = 0;
do
{
inzeig = CmdParse(KMS_LC->Session.InputBuffer, inzeig);
if (CmdArgC)
keepgoing = CmdExecute(CmdSearch(CmdArgV[0]));
} while(inzeig && keepgoing);
return keepgoing;
}
///
/***************************************
* Kommando ausführen *
***************************************
* I: Befehlsnummer *
* O: Logout: FALSE, Weiter: TRUE *
***************************************/
/// "CmdExecute"
BOOL CmdExecute(UWORD cmdnum)
{
if (cmdnum)
{
struct CommandNode *cpoint = KMSBase->CommandList.mlh_Head;
while(cpoint->Node.mln_Succ && cpoint->ID != cmdnum)
cpoint = cpoint->Node.mln_Succ;
strcpy(KMS_LC->Session.CurrCmd, cpoint->Name);
}
switch(cmdnum)
{
case 0:
SysMsg(UNKNOWN_COMMAND);
break;
case 1:
Cmd_BRETT();
break;
case 2:
Cmd_INHALT();
break;
case 3:
Cmd_LESEN();
break;
case 4:
Cmd_SCHREIBEN();
break;
case 5:
Cmd_UMSINFO();
break;
case 6:
Cmd_QMARK();
break;
case 7:
Cmd_HILFE();
break;
case 8:
Cmd_PDIR();
break;
case 9:
Cmd_HISTORY();
break;
case 10:
Cmd_UMSDIR();
break;
case 11:
Cmd_AEDIT();
break;
case 12:
Cmd_UMSEXPIRE();
break;
case 13:
Cmd_PEDIT();
break;
case 14:
Cmd_PDELETE();
break;
case 15:
Cmd_DELETE();
break;
case 16:
Cmd_BITED();
break;
case 17:
Cmd_ANTWORT();
break;
case 18:
Cmd_USERPREFS();
break;
case 19:
Cmd_DELPROT();
break;
case 20:
Cmd_SELECT();
break;
case 21:
Cmd_HIDE();
break;
case 22:
Cmd_ECHO();
break;
case 23:
Cmd_LABERFILTER();
break;
case 24:
Cmd_VORMERKER();
break;
case 25:
Cmd_SCHREIBMODUS();
break;
case 26:
Cmd_UEDIT();
break;
case 27:
Cmd_UDIR();
break;
case 28:
Cmd_SIGEDIT();
break;
case 29:
SysMsg(USER_LEAVING);
Plop = PLOP_LOGOUT;
return FALSE;
break;
case 30:
Cmd_SHUTDOWN();
break;
case 31:
Cmd_INFO();
break;
case 32:
Cmd_ALIAS();
break;
case 33:
Cmd_CHAT();
break;
case 34:
Cmd_TEMPPREFS();
break;
case 35:
Cmd_LOG();
break;
case 36:
Cmd_UPLOAD();
break;
case 37:
Cmd_DOWNLOAD();
break;
case 38:
Cmd_ACLEDIT();
break;
case 39:
Cmd_SYSMSG();
break;
case 40:
Cmd_PORTLIST();
break;
case 41:
Cmd_REREAD();
break;
case 42:
Cmd_EXEC();
break;
case 43:
Cmd_PAUSE();
break;
case 44:
Cmd_PASSWORD();
break;
case 45:
Cmd_PUPLOAD();
break;
case 46:
Cmd_PDOWNLOAD();
break;
case 999:
Cmd_KMSBATCH();
break;
default: /* Kommando als ARexx-Skript realisiert? */
Cmd_KMSREXX(cmdnum);
break;
}
return TRUE;
}
///
/***************************************
* Kommando in Liste suchen *
***************************************
* I: Befehlswort *
* O: Befehls-ID *
***************************************/
/// "CmdSearch"
UWORD CmdSearch(STRPTR cmd)
{
struct CommandNode *cpoint;
UWORD result = 0, minlen, pos = 0;
TEXT command[LEN_COMMAND+1];
if (!cmd || !*cmd)
return 0;
if (!strcmp(cmd, "@"))
return 999;
cpoint = KMSBase->CommandList.mlh_Head;
/* Gegebenes Kommando in Großbuchstaben wandeln */
Upper(cmd);
/* Jetzt suchen */
while(cpoint->Node.mln_Succ && !result)
{
pos = 0;
minlen = 0;
while(cpoint->Name[pos] && ((cpoint->Name[pos] >= 'A' && cpoint->Name[pos] <= 'Z') || strchr("ÖÄÜ", cpoint->Name[pos])))
{
minlen++;
pos++;
}
if (strlen(cmd) >= minlen)
{
strcpy(command, cpoint->Name);
Upper(command);
if (!strncmp(command, cmd, strlen(cmd)) && ((cpoint->Level >= 0 && cpoint->Level <= KMS_LC->Session.CurrentUser->UserData.Level)
|| (cpoint->Level < 0 && -cpoint->Level == KMS_LC->Session.CurrentUser->UserData.Level)))
result = cpoint->ID;
}
cpoint = cpoint->Node.mln_Succ;
}
return result;
}
///
/***************************************
* Kommando-Parameter prüfen *
***************************************
* I: Stelle des Parameters, Wort *
* O: TRUE: Gefunden, FALSE: Nicht *
***************************************/
/// "CmpArg"
BOOL CmpArg(UBYTE idx, STRPTR string)
{
if (CmdArgC > idx && !stricmp(CmdArgV[idx], string))
return TRUE;
else
return FALSE;
}
///
/*******************************************
* MsgHeader-Steuercodes uebersetzen *
*******************************************
* I: InString, OutString, Max. Laenge *
* O: OK: OutString / Fehler: NULL *
*******************************************/
/// "MsgStringParse"
extern STRPTR RFromName;
extern STRPTR RFromAddr;
extern STRPTR RToName;
extern STRPTR RToAddr;
extern STRPTR RCreationDate;
extern STRPTR RGroup;
extern STRPTR RSubject;
STRPTR MsgStringParse(STRPTR qs, STRPTR line, UWORD maxlen)
{
UWORD qspos = 0, linpos = 0;
STRPTR rfromname = "";
if (RFromName) rfromname = RFromName;
STRPTR rfromaddr = "";
if (RFromAddr) rfromaddr = RFromAddr;
STRPTR rtoname = "";
if (RToName) rtoname = RToName;
STRPTR rtoaddr = "";
if (RToAddr) rtoaddr = RToAddr;
STRPTR rcreationdate = "";
if (RCreationDate) rcreationdate = RCreationDate;
STRPTR rgroup = "";
if (RGroup) rgroup = RGroup;
STRPTR rsubject = "";
if (RSubject) rsubject = RSubject;
line[linpos] = '\0';
while(qs[qspos])
{
while(linpos < maxlen && qs[qspos] != '\0' && qs[qspos] != '%')
line[linpos++] = qs[qspos++];
if (linpos < maxlen && qs[qspos] == '%' && qs[qspos+1] != '\0' && qs[qspos+1] != '%')
{
line[linpos] = '\0';
switch(qs[++qspos])
{
case 'g':
if (strlen(rgroup))
strncat(line, rgroup, maxlen-strlen(line));
else
strncat(line, "-MAIL-", maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'f':
strncat(line, rfromname, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'v':
strncat(line, rfromname, maxlen-strlen(line));
line[maxlen] = '\0';
while(line[linpos] != ' ' && line[linpos] != '\0')
linpos++;
line[linpos] = '\0';
break;
case 't':
strncat(line, rtoname, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'd':
strncat(line, rcreationdate, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 's':
strncat(line, rsubject, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'F':
strncat(line, rfromaddr, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'T':
strncat(line, rtoaddr, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
default:
line[linpos++] = qs[qspos];
break;
}
qspos++;
}
else if (linpos < maxlen && qs[qspos] == '%' && qs[qspos+1] == '%') /* "%%" */
{
line[linpos++] = qs[qspos++];
qspos++;
}
else if (linpos < maxlen && qs[qspos] != '\0') /* Fall "%\0" */
line[linpos++] = qs[qspos++];
if (linpos >= maxlen)
{
line[maxlen] = '\0';
return line;
}
}
line[linpos] = '\0';
return line;
}
///
/*******************************************
* Standard Steuercodes uebersetzen *
*******************************************
* I: InString, OutString, Max. Laenge *
* O: OK: OutString / Fehler: NULL *
*******************************************/
/// "StdStringParse"
static parsecalls = 0;
STRPTR StdStringParse(STRPTR qs, STRPTR line, UWORD maxlen)
{
UWORD qspos = 0, linpos = 0;
LONG n;
TEXT numbuff[LEN_NUMBER+1], timebuff[LEN_MAKETIME+1];
TEXT dosbuff[LEN_DOSPATH+1];
TEXT outbuff[LEN_PARSEOUT+1]; /* Für Rekursion! Achtung Stack! */
line[linpos] = '\0';
/* Nur EIN Rekursionsaufruf erlaubt! */
if (parsecalls++ == 2)
{
parsecalls--;
return line;
}
while(qs[qspos])
{
while(linpos < maxlen && qs[qspos] != '\0' && qs[qspos] != '%')
line[linpos++] = qs[qspos++];
if (linpos < maxlen && qs[qspos] == '%' && qs[qspos+1] != '\0' && qs[qspos+1] != '%')
{
line[linpos] = '\0';
/* Steuercode interpretieren */
switch(qs[++qspos])
{
case '1': /* Vordergrund-Farben */
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
TEXT farbe[3];
farbe[0] = qs[qspos];
farbe[1] = 'm';
farbe[2] = '\0';
strncat(line, "\033[3", maxlen-strlen(line));
line[maxlen] = '\0';
strncat(line, farbe, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case '(': /* Hintergrund-Farben */
case ')':
case '*':
case '+':
case ',':
case '-':
case '.':
case '/':
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
TEXT farbe[3];
farbe[0] = qs[qspos] + 8;
farbe[1] = 'm';
farbe[2] = '\0';
strncat(line, "\033[4", maxlen-strlen(line));
line[maxlen] = '\0';
strncat(line, farbe, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'B': /* Bold */
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
strncat(line, BOLD, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'E': /* ESC */
line[linpos++] = '\033';
break;
case 'G': /* Bell */
line[linpos++] = '\7';
break;
case 'I': /* Tab */
line[linpos++] = '\t';
break;
case 'J': /* Line Feed */
line[linpos++] = '\n';
break;
case 'L': /* Soft-CLS */
if (!(KMS_LC->Session.CurrentUser->UserData.Flags & UF_CLS))
break;
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
strncat(line, CLS, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
else
line[linpos++] = '\f';
break;
case 'M': /* Carriage Return */
line[linpos++] = '\r';
break;
case 'N': /* Neue Zeile */
line[linpos++] = '\r';
if (linpos < maxlen)
line[linpos++] = '\n';
break;
case 'O': /* Normal */
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
strncat(line, OFF, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'R': /* Reverse */
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
strncat(line, INV, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'X': /* Hard-CLS */
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
{
strncat(line, CLS, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
else
line[linpos++] = '\f';
break;
case 'a': /* Verbindungszeit in Minuten */
n = (time(NULL) - KMS_LC->Session.LoginTime) / 60;
sprintf(numbuff, "%ld", n);
strncat(line, numbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'b': /* Restzeit in Minuten */
if (!KMS_LC->Session.MaxConnectTime)
strncat(line, "-?-", maxlen - strlen(line));
else
{
n = KMS_LC->Session.MaxConnectTime * 60 - time(NULL) + KMS_LC->Session.LoginTime;
n /= 60;
if (n < 0)
n = 0;
sprintf(numbuff, "%ld", n);
strncat(line, numbuff, maxlen-strlen(line));
}
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'c': /* Verbindungszeit HH:MM:SS */
MakeTime(timebuff, KMS_LC->Session.LoginTime, 0);
strncat(line, timebuff+9, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'd': /* Restzeit HH:MM:SS */
if (!KMS_LC->Session.MaxConnectTime)
strncat(line, "-?-", maxlen - strlen(line));
else
{
n = KMS_LC->Session.MaxConnectTime * 60 - time(NULL) + KMS_LC->Session.LoginTime;
if (n < 0)
n = 0;
sprintf(timebuff, "%02d:%02d:%02d", n/3600, (n%3600)/60, n%60);
strncat(line, timebuff, maxlen-strlen(line));
}
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'e': /* Username */
strncat(line, KMS_LC->Session.CurrentUser->UserData.Name, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'f': /* Realname */
strncat(line, KMS_LC->Session.CurrentUser->UserData.RealName, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'g': /* Stadt */
strncat(line, KMS_LC->Session.CurrentUser->UserData.City, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'h': /* Level */
sprintf(numbuff, "%d", KMS_LC->Session.CurrentUser->UserData.Level);
strncat(line, numbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'i': /* LastCall Date */
MakeTime(timebuff, 0, KMS_LC->Session.CurrentUser->UserData.LastCall);
timebuff[8] = '\0';
strncat(line, timebuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'j': /* LastCall Time */
MakeTime(timebuff, 0, KMS_LC->Session.CurrentUser->UserData.LastCall);
strncat(line, &timebuff[9], maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'k': /* Anrufe bisher */
sprintf(numbuff, "%d", KMS_LC->Session.CurrentUser->UserData.Calls);
strncat(line, numbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'l': /* Prompt */
StdStringParse(KMS_LC->Session.CurrentUser->UserData.Prompt, outbuff, LEN_PARSEOUT);
strncat(line, outbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'm': /* Aktuelle Zeit */
MakeTime(timebuff, 0, 0);
strncat(line, &timebuff[9], maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'n': /* Aktuelles Datum */
MakeTime(timebuff, 0, 0);
timebuff[8] = '\0';
strncat(line, timebuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'o': /* TempDir */
if (strlen(line) + strlen(KMSBase->TempDir) <= maxlen)
{
strcat(line, KMSBase->TempDir);
linpos = strlen(line);
}
break;
case 'p': /* Current Path */
CreatePath(KMS_LC->Session.CurrentArea);
strncat(line, PathString, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'q': /* SerDevice */
if (strlen(line) + strlen(KMS_LC->SerDevice) <= maxlen)
{
strcat(line, KMS_LC->SerDevice);
linpos = strlen(line);
}
break;
case 'r': /* BinDir */
if (strlen(line) + strlen(KMSBase->BinDir) <= maxlen)
{
strcat(line, KMSBase->BinDir);
linpos = strlen(line);
}
break;
case 's': /* Zeilen */
sprintf(numbuff, "%d", KMS_LC->Session.CurrentUser->UserData.PageLen);
strncat(line, numbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 't': /* Spalten */
sprintf(numbuff, "%d", KMS_LC->Session.CurrentUser->UserData.LineLen);
strncat(line, numbuff, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
break;
case 'u': /* User-Dir */
strcpy(dosbuff, KMSBase->UserDir);
strcat(dosbuff, KMS_LC->Session.CurrentUser->UserData.Name);
ConvertSpace(dosbuff);
if (strlen(line) + strlen(dosbuff) <= maxlen)
{
strcat(line, dosbuff);
linpos = strlen(line);
}
break;
case 'v': /* Variables Argument */
if (PPArg)
{
strncat(line, PPArg, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'w': /* Variables Argument 2 */
if (PPArg2)
{
strncat(line, PPArg2, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'x': /* Variables Argument 3 */
if (PPArg3)
{
strncat(line, PPArg3, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'y': /* Variables Argument 4 */
if (PPArg4)
{
strncat(line, PPArg4, maxlen-strlen(line));
line[maxlen] = '\0';
linpos = strlen(line);
}
break;
case 'z': /* SerUnit */
sprintf(numbuff, "%d", KMS_LC->SerUnit);
if (strlen(line) + strlen(numbuff) <= maxlen)
{
strcat(line, numbuff);
linpos = strlen(line);
}
break;
default:
line[linpos++] = qs[qspos];
break;
}
qspos++;
}
else if (linpos < maxlen && qs[qspos] == '%' && qs[qspos+1] == '%') /* Fall "%%" */
{
line[linpos++] = qs[qspos++];
qspos++;
}
else if (linpos < maxlen && qs[qspos] != '\0') /* Fall "%\0" */
line[linpos++] = qs[qspos++];
if (linpos >= maxlen)
{
line[maxlen] = '\0';
parsecalls--;
return line;
}
}
line[linpos] = '\0';
parsecalls--;
return line;
}
///
/***************************************
* Parsing von Range-Angaben *
***************************************
* I: Range-Liste *
* O: Erfolg TRUE/FALSE *
***************************************/
/// "ParseRange"
BOOL ParseRange(STRPTR range)
{
TEXT ws[] = ",";
STRPTR arg, minus;
UMSMsgNum num;
UMSSelectTags(MyUMSAccount, UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelUnset, KMSLSTATF_InRange,
TAG_DONE);
for (arg = strtok(range, ws); arg; arg = strtok(NULL, ws))
{
if (minus = strchr(arg, '-'))
{
if (minus == arg) /* "-x" */
{
UMSSelectTags(MyUMSAccount, UMSTAG_SelStop, atol(arg+1)+1,
UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelSet, KMSLSTATF_InRange,
TAG_DONE);
}
else if (*(minus + 1) == '\0') /* "x-" */
{
UMSSelectTags(MyUMSAccount, UMSTAG_SelStart, atol(arg),
UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelSet, KMSLSTATF_InRange,
TAG_DONE);
}
else /* "x-y" */
{
UMSSelectTags(MyUMSAccount, UMSTAG_SelStart, atol(arg),
UMSTAG_SelStop, atol(minus+1)+1,
UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelSet, KMSLSTATF_InRange,
TAG_DONE);
}
}
else if (atol(arg)) /* "x" */
UMSSelectTags(MyUMSAccount, UMSTAG_SelMsg, atol(arg),
UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelSet, KMSLSTATF_InRange,
TAG_DONE);
}
SelectArea(KMS_LC->Session.CurrentArea->AreaData.MBName);
UMSSelectTags(MyUMSAccount, UMSTAG_SelReadLocal, TRUE,
UMSTAG_SelWriteLocal, TRUE,
UMSTAG_SelMask, KMSLSTATF_InRange|KMSLSTATF_InGroup,
UMSTAG_SelMatch, KMSLSTATF_InRange,
UMSTAG_SelUnset, KMSLSTATF_InRange,
TAG_DONE);
num = UMSSelectTags(MyUMSAccount, UMSTAG_SelReadLocal, TRUE,
UMSTAG_SelMask, KMSLSTATF_InRange,
UMSTAG_SelMatch, KMSLSTATF_InRange,
TAG_DONE);
if (!num)
return FALSE;
else
return TRUE;
}
///
/***************************************
* Chat-Interpreter *
***************************************
* I: --- *
* O: keepgoing *
***************************************/
/// "ChatInterpreter"
BOOL ChatInterpreter(STRPTR buffer)
{
BOOL keepgoing = TRUE;
if (buffer[0] != '.' && buffer[0] != ':')
{
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
ChatOut(buffer, CO_METOO);
else
ChatOut(buffer, 0);
}
else
keepgoing = ChatCmd(buffer);
return keepgoing;
}
///
/***************************************
* Chat-Kommando auswerten *
***************************************
* I: --- *
* O: Chat-Exit Ja/Nein *
***************************************/
/// "ChatCmd"
BOOL ChatCmd(STRPTR buffer)
{
TEXT buff[LEN_MAXLINE+1];
if (*buffer == ':')
{
ChatOut(buffer+1, CO_METOO|CO_EMOTE);
return TRUE;
}
else if (!stricmp(buffer, ".w"))
{
struct KMSNode *member = KMSBase->MemberList.mlh_Head;
TakeMSem(FALSE);
while(member->Node.mln_Succ)
{
if (member->LCPtr->Session.CommMode == CM_CHAT)
{
sprintf(buff, "%2d> %s (%s)", member->LCPtr->ID, member->LCPtr->Session.CurrentUser->UserData.Name, member->LCPtr->Session.ChatChannel);
ChatPrint(buff);
}
member = member->Node.mln_Succ;
}
DropMSem();
return TRUE;
}
else if (buffer[1] == 'k')
{
if (strlen(buffer) > 2)
{
sprintf(buff, "------ %s ------", KMS_LC->Session.CurrentUser->UserData.Name);
ChatOut(buff, CO_NOPROMPT);
strncpy(KMS_LC->Session.ChatChannel, buffer+2, 15);
KMS_LC->Session.ChatChannel[15] = '\0';
sprintf(buff, "++++++ %s ++++++", KMS_LC->Session.CurrentUser->UserData.Name);
ChatOut(buff, CO_NOPROMPT);
sprintf(buff, "===> [%s]", KMS_LC->Session.ChatChannel);
ChatPrint(buff);
sprintf(buff, CHAT_INCLR, KMS_LC->Session.CurrentUser->UserData.PageLen-4);
Print(buff, PF_NOLF|PF_NOBRK);
sprintf(buff, CHAT_POS, KMS_LC->Session.CurrentUser->UserData.PageLen-4);
Print(buff, PF_NOLF|PF_NOBRK);
PPArg = KMS_LC->Session.ChatChannel;
SysMsg(CHAT_STATUS_LINE);
PPArg = NULL;
}
return TRUE;
}
else if (!stricmp(buffer, ".x"))
return FALSE;
else
{
if (KMS_LC->Session.CurrentUser->UserData.Flags & UF_EMU_ANSI)
ChatOut(buffer, CO_METOO);
else
ChatOut(buffer, 0);
return TRUE;
}
}
///